package com.aat.dxfy.shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Test02 {
	private static Logger log = LoggerFactory.getLogger(Test02.class);

	public static void main(String[] args) {
		// 1.加载shiro安全管理
		Factory<SecurityManager> fac = new IniSecurityManagerFactory(
				"classpath:shiro2.ini");
		// 2.安全管理开始创建
		SecurityManager securityManager = fac.getInstance();
		// 3.安全工具里放入安全管理器
		SecurityUtils.setSecurityManager(securityManager);
		// 4.安全工具取得用户或者当前的执行者
		Subject currentUser = SecurityUtils.getSubject();

		// 6.当前用户有没有被验证是可用的，如果没有证明或者验证 ，用户密码器执行登录验证
		if (!currentUser.isAuthenticated()) {
			UsernamePasswordToken token = new UsernamePasswordToken("admin","qq",true);
			//token.setRememberMe(true);
			// currentUser.login(token);
			// 7.如果登录失败了？异常会提示什么原因
			try {
				currentUser.login(token);
			} catch (UnknownAccountException e) {
				log.info("没有这个用户！");
			} catch (IncorrectCredentialsException e) {
				log.info("密码错误！");
			} catch (LockedAccountException e) {
				log.info("账户被锁定！");
			} catch (AuthenticationException e) {
				log.info("未知的原因！");
			}
			log.info("User:" + currentUser.getPrincipal());
			// 8.测试角色
			if (currentUser.hasRole("system")) {
				log.info("拥有system角色");
			} else {
				log.info("对不起，没有system角色。");
			}
			if (currentUser.hasRole("user")) {
				log.info("拥有user角色");
			} else {
				log.info("对不起，没有user角色。");
			}
			// 9,测试权限
			if (currentUser.isPermitted("*")) {
				log.info("所有权限.");
			} else {
				log.info("没有权限。");
			}
			// 10.我们可以执行极其强大的实例级权限检查——判断用户是否有能力访问某一类型的特定实例的能力
			if (currentUser.isPermitted("*:view:book")) {
				log.info("你拥有所有资源的权限.");
			} else {
				log.info("对不起,没有特定权限。");
			}
			if (currentUser.isPermitted("jsp:view:one")) {
				log.info("你拥有特定的权限哦.");
			} else {
				log.info("对不起,没有特定权限哦。");
			}
			// 11.用户完事后，注销
			currentUser.logout();
			log.info("host:"+token.getHost());
			log.info("注销退出。");
		}

		System.exit(0);
	}

}
